package datos;

import java.util.*;

public class ListaUsuarios
{
    private Collection <Nodo> miSet;

    public ListaUsuarios()
    {
        /*
         * Se inicializa el ArrayList
         */
        Comparator comparadorApellido = new CompararApellido();
        miSet = new TreeSet(comparadorApellido);
    }


    /**
     *
     * Método public void imprimirColeccion(): Este método imprime el
     * contenido de la colección miSet
     */
    public void imprimirColeccion()
    {
        int i;
        Nodo registro;

        /*
         * Se define un arreglo de tipo Object (la clase genérica Java)
         */
        Object [] arreglo;

        /*
         * Se convierte la colección pasada como parámetro a un array, que
         * es asignado al arreglo de tipo Object
         */
        arreglo = miSet.toArray();

        System.out.println("DATOS");

        /*
         * Se hace un recorrido del arreglo de tipo Object y se imprime
         * la información de la casilla i
         */
        for(i=0 ; i<arreglo.length ; i++)
        {
            registro = (Nodo) arreglo[i];
            System.out.println("Nombre: " + registro.getNombre());
            System.out.println("Apellido: " + registro.getApellido());
            System.out.println("Cargo: " + registro.getCargo());
            System.out.println();
        }

        System.out.println("\n\n");
    }

    public void imprimirColeccionOrdenada()
    {
        int i;
        Nodo registro;

        /*
         * Se define un arreglo de tipo Object (la clase genérica Java)
         */
        Object [] arreglo;

        Comparator comparadorApellido = new CompararApellido();
        SortedSet setOrdenado = new TreeSet(comparadorApellido);
        //setOrdenado.addAll(new HashSet(this.miSet));
        setOrdenado.addAll(this.miSet);

        /*
         * Se convierte la colección pasada como parámetro a un array, que
         * es asignado al arreglo de tipo Object
         */
        arreglo = setOrdenado.toArray();

        System.out.println("DATOS");

        /*
         * Se hace un recorrido del arreglo de tipo Object y se imprime
         * la información de la casilla i
         */
        for(i=0 ; i<arreglo.length ; i++)
        {
            registro = (Nodo) arreglo[i];
            
            System.out.println(registro);
        }

        System.out.println("\n\n");
    }

    public javax.swing.JComboBox cargarDatos(javax.swing.JComboBox elCombo)
    {
        int i;
        Nodo registro;
        String cadena;

        /*
         * Se define un arreglo de tipo Object (la clase genérica Java)
         */
        Object [] arreglo;

        /*
         * Se convierte la colección pasada como parámetro a un array, que
         * es asignado al arreglo de tipo Object
         */
        arreglo = miSet.toArray();

        /*
         * Se hace un recorrido del arreglo de tipo Object y se imprime
         * la información de la casilla i
         */
        for(i=0 ; i<arreglo.length ; i++)
        {
            registro = (Nodo) arreglo[i];

            cadena = registro.getApellido() + ", " + registro.getNombre();

            elCombo.addItem(cadena);
        }

        return elCombo;
    }

    public Nodo devolverDatosUsuario(int indiceUsuario)
    {
        Nodo    auxiliar = null;
        int     indiceAuxiliar;

        Iterator elIterador = miSet.iterator();

        indiceAuxiliar = -1;

        while (elIterador.hasNext() && indiceAuxiliar != indiceUsuario)
        {
            auxiliar = (Nodo) elIterador.next();
            indiceAuxiliar++;
        }
        
        return auxiliar;
    }


    /**
     *
     * Método public boolean agregarElemento(Nodo objeto): Este método agrega
     * el Nodo "objeto" a la colección miSet
     */
    public boolean agregarElemento(Nodo objeto)
    {
        return miSet.add(objeto);
    }


    /**
     *
     * Método public boolean removerElemento(Nodo objeto): Este método elimina
     * el Nodo "objeto" de la colección miSet
     */
    public boolean removerElemento(Nodo objeto)
    {
        boolean encontrado = false;
        Nodo auxiliar = null;

        /*
         * Se define un iterador inicializado con el iterador de la colección
         */
        Iterator iterador = miSet.iterator();

        /*
         * Mientras no se encuentre el elemento y existan mas elementos en la
         * colección, se sigue entrando en el ciclo
         */
        while (!encontrado && iterador.hasNext())
        {
            /*
             *  Se obtiene el siguiente objeto del iterador y se le hace un cast
             *  para asignarlo al objeto de tipo Nodo
             */
            auxiliar = (Nodo) iterador.next();

            /*
             * Se invoca al método equals de la clase Nodo para determinar si son
             * iguales. En caso de serlo, se encontró el elemento buscado
             */
            if (objeto.equals(auxiliar))
                encontrado = true;
        }

        /*
         * Si se encontró el elemento, se procede a ejecutar el remove
         */
        if (encontrado)
        {
            if (miSet.remove(auxiliar))
                return true;
        }

        return false;
    }

}
